#include <etcd/Client.hpp>
#include <etcd/KeepAlive.hpp>
#include <etcd/Response.hpp>
#include <etcd/Value.hpp>
#include <etcd/Watcher.hpp>
#include <iostream>
#include <thread>
void callback(const etcd::Response& resp)
{
    if (resp.is_ok()==false)
    {
        std::cout << "监控失败" << resp.error_message() << std::endl;
        return;
    }
    for (auto& event : resp.events())
    {
        if (event.event_type() == etcd::Event::EventType::PUT)
        {
            std::cout << "服务信息发生了改变,当前值:" << event.kv().as_string() <<"原来值:"<< event.prev_kv().as_string()<<std::endl;
        }
        else if (event.event_type() == etcd::Event::EventType::DELETE_)
        {
            std::cout << "服务信息下线删除,删除值:" << event.prev_kv().as_string() << std::endl;
        }
    }
}
int main()
{
    etcd::Client etcd_host("http://127.0.0.1:2379");
    // 实例化客户端对象
    etcd::Client client(etcd_host);
    // get :etcd甚至管理键值对的时候，可以管理目录,这样可以监控目录下的所有键值对
    auto resp = client.ls("/service").get();//这里可能获得多个键值对,因此需要便利
    if(resp.is_ok()==false)
    {
        std::cout<<"获取键值对失败"<<resp.error_message()<<std::endl;
        return -1;
    }
    int sz = resp.keys().size();
    for(int i=0;i<sz;i++)
    {
       std::cout<<resp.value(i).as_string()<<"可以提供"<< resp.key(i)<<std::endl;
    }
    //实例化一个监控对象,监控传入的key值
    auto watcher = etcd::Watcher(client,"/service/usr", callback,true);//true表示监控/service目录下所有目录的改变,是递归进行的
    watcher.Wait();
    return 0;

}
